96. 不同的二叉搜索树

96. 不同的二叉搜索树

题目链接
代码随想录

分析

我们首先还是把 dp[i] 定义为 i 个节点有多少种满足二叉搜索树的种数,然后我们开始思考状态转移公式。
其实我们对于二叉树首先要明白一点,确定一个二叉树,其实第一步就是确定这个二叉树的根节点,n=3 的时候,有 1,2,3 三个节点,我们如何确定这三个节点能构成的二叉搜索树呢?

解题

public int numTrees(int n) {
    if(n==1){
        return n;
    }
    int[] dp = new int[n+1];
    dp[1]=1;
    for(int i=2;i<=n;i++){
        int count=0;
        for(int j=1;j<=i;j++){
            int leftNodeCount = j-1;
            int rightNodeCount = i-j;
            // 也可以把dp[0]初始化成1,但是是没有意义的,不要这样做。
            int leftCount = leftNodeCount==0?1:dp[leftNodeCount];
            int rightCount = rightNodeCount==0?1:dp[rightNodeCount];
            count+=leftCount*rightCount;
        }
        dp[i]=count;
    }
    return dp[n];        
}

相关题